# 从 collections 模块导入 deque 类，deque 是双端队列，可高效地从队列两端添加或删除元素
from collections import deque

# 读取输入的三个整数 n, m, k
# n 表示地图的行数
# m 表示地图的列数
# k 表示在连续相同颜色格子上可以行走的最大步数
n, m, k = map(int, input().split())

# 初始化地图 graph 列表，用于存储地图信息
graph = []
# 初始化三维数组 vis 用于记录访问状态
# vis[i][j][c] 表示到达坐标 (i, j) 且当前连续相同颜色格子步数为 c 时的最小步数
# 初始值设为 -1 表示未访问过
vis = [[[-1] * (k + 1) for _ in range(m + 1)] for _ in range(n + 1)]
# 定义四个方向的偏移量，分别表示向下、向右、向上、向左
nxt = [(1, 0), (0, 1), (-1, 0), (0, -1)]

# 读取地图信息
for i in range(n):
    # 读取一行输入并转换为字符列表
    c = list(input())
    # 将该行添加到地图 graph 中
    graph.append(c)

# 标志变量，用于判断是否能到达终点
flag = 1
# 初始化双端队列 p，存储待处理的状态
# 队列中的每个元素是一个列表 [a, b, c, dis]
# a, b 表示当前坐标
# c 表示当前连续相同颜色格子的步数
# dis 表示从起点到当前位置的步数
p = deque([[0, 0, 1, 0]])
# 标记起点 (0, 0) 且连续相同颜色格子步数为 1 时的最小步数为 0
vis[0][0][1] = 0

# 开始广度优先搜索（BFS）
while p:
    # 从队列头部取出一个状态
    a, b, c, dis = p.popleft()
    # 判断是否到达终点
    if a == n - 1 and b == m - 1:
        # 若到达终点，输出从起点到终点的步数
        print(dis)
        # 将标志变量设为 0，表示已找到路径
        flag = 0
        # 跳出循环
        break
    else:
        # 遍历四个方向
        for dx, dy in nxt:
            # 计算下一个位置的坐标
            nx, ny = a + dx, b + dy
            # 判断下一个位置是否在地图范围内
            if 0 <= nx < n and 0 <= ny < m:
                # 情况 1：当前连续相同颜色格子步数小于 k 且下一个格子颜色与当前格子颜色相同
                # 并且该状态未被访问过
                if c < k and graph[nx][ny] == graph[a][b] and vis[nx][ny][c + 1] == -1:
                    # 更新该状态的最小步数
                    vis[nx][ny][c + 1] = dis + 1
                    # 将该状态加入队列
                    p.append([nx, ny, c + 1, dis + 1])
                # 情况 2：当前连续相同颜色格子步数达到 k 且下一个格子颜色与当前格子颜色不同
                # 并且该状态未被访问过
                elif c == k and graph[nx][ny] != graph[a][b] and vis[nx][ny][1] == -1:
                    # 更新该状态的最小步数
                    vis[nx][ny][1] = dis + 1
                    # 将该状态加入队列
                    p.append([nx, ny, 1, dis + 1])

# 如果标志变量仍为 1，表示未找到路径
if flag:
    # 输出 -1 表示无法到达终点
    print(-1)